package es.tikitaka.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dao.EstEquipoService;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.equipo.EstEquipo;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */
@Name("estEquipoService")
public class EstEquipoServiceImpl implements EstEquipoService {

	@In
	EntityManager em;

	/**
	 * Constructor por defecto
	 */
	public EstEquipoServiceImpl() {
	}

	/**
	 * Método para obtener la lista de los equipos más goleadores
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstEquipo> getListEqPichichi(Temporada temporada) {
		List<EstEquipo> result = new ArrayList<EstEquipo>();

		result = em
				.createQuery(
						"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.golesF")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lista de los equipos menos goleados
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstEquipo> getListEqZamora(Temporada temporada) {
		List<EstEquipo> result = new ArrayList<EstEquipo>();

		result = em
				.createQuery(
						"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.golesC desc")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lita de los equipos con más faltas cometidas
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstEquipo> getListEqMasFaltasC(Temporada temporada) {
		List<EstEquipo> result = new ArrayList<EstEquipo>();

		result = em
				.createQuery(
						"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.faltasC")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lista de los equipos con más faltas recibidas
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstEquipo> getListEqMasFaltasR(Temporada temporada) {
		List<EstEquipo> result = new ArrayList<EstEquipo>();

		result = em
				.createQuery(
						"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.faltasR")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lista de los equipos con más tarjetas
	 * 
	 * @param temporada
	 * @param tarjeta
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstEquipo> getListEqMasAmonestado(Temporada temporada,
			String tarjeta) {
		List<EstEquipo> result = new ArrayList<EstEquipo>();

		if (tarjeta.equals("Tarjeta amarilla")) {
			result = em
					.createQuery(
							"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.amarillas")
					.setParameter("temporada", temporada.getAnio())
					.getResultList();
		} else if (tarjeta.equals("Tarjeta roja")) {
			result = em
					.createQuery(
							"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.rojas")
					.setParameter("temporada", temporada.getAnio())
					.getResultList();
		} else if (tarjeta.equals("Tarjeta azul")) {
			result = em
					.createQuery(
							"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.azules")
					.setParameter("temporada", temporada.getAnio())
					.getResultList();
		}

		return result;
	}

	/**
	 * Método para obtener la lista de los equipos con más penaltys cometidos
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings( { "unchecked", "unchecked" })
	public List<EstEquipo> getListEqMasPenaltysC(Temporada temporada) {
		List<EstEquipo> result = new ArrayList<EstEquipo>();

		result = em
				.createQuery(
						"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.penaltysC")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lita de los equipos con más penaltys lanzados
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstEquipo> getListEqMasPenaltysL(Temporada temporada) {
		List<EstEquipo> result = new ArrayList<EstEquipo>();

		result = em
				.createQuery(
						"select e from EstEquipo e join fetch e.temporada t where t.anio =:temporada order by e.penaltysM")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para eliminar del sistema unas estadisticas de equipo dada
	 * 
	 * @param id
	 *            Id de las estadisticas de equipo a eliminar
	 * @return estado del proceso (true or false)
	 */
	public boolean delete(Integer id) {
		boolean correcto;
		try {
			EstEquipo est = em.getReference(EstEquipo.class, id);
			em.remove(est);
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

	/**
	 * Método para almacenar en el sistema estadísticas de un equipo
	 * 
	 * @param estadisticas
	 *            Estadísticas a almacenar
	 * @return estado del proceso (true or false)
	 */
	public boolean save(EstEquipo estadisticas) {
		boolean correcto;
		try {
			em.persist(estadisticas);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}
}
